# coding=utf-8

# 7种方式： https://blog.csdn.net/xiemanR/article/details/72427520

# 在 Python 中，我们可以用多种方法来实现单例模式：

# 使用模块
# 使用 __new__
# 使用装饰器（decorator）
# 使用元类（metaclass）


# 使用模块
class mySingleton(object):
    def dosth(self):
        print "Singleton"

my_singleton_object = mySingleton()

# 使用
# from xxx import my_singleton_object

""""""
# 使用 __new__
class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
        return cls._instance


#使用继承Singleton
# class ClassA(Singleton):
#     pass

""""""
# 使用装饰器 装饰器（decorator）可以动态地修改一个类或函数的功能
# 定义装饰器
from functools import wraps

def singleton(cls):
    instances = {}
    @wraps(cls)
    def getinstance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, ** kw)
        return instances[cls]
    return getinstance

# 使用
# @singleton
# class ClassB(object):
#     pass

""""""
# 使用 metaclass
# 元类（metaclass）可以控制类的创建过程，它主要做三件事：

# 拦截类的创建
# 修改类的定义
# 返回修改后的类

class SingletonMetaclass(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(SingletonMetaclass, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

# 使用
# Python2
# class MyClass(object):
#     __metaclass__ = SingletonMetaclass
# Python3
# class MyClass(metaclass=SingletonMetaclass):
#    pass